package nige.volum.db;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;

import nige.mesure.ecran.LogPrincipale;

/**Classe.
 * Construit un objet qui est
 * l'image d une requete dans la
 * base de donnees
 * @author Nicolas Genevaux
 */
public final class DBObject {

	/**
	 * Connexion gnerique
	 */
	public static Connexion CONN = null;
	
  /**Fonction.
   * Constructeur prive pour la
   * classe utilitaire
   */
  private DBObject() {
    // Rien a faire dans un
    // constructeur prive
  }
/**
 * Nettoie une chaine de caractere
 * @param sql Requete a nettoyer
 * @return Une requete executable
 */
  public static String cleanString(String sql) {
	  String ret = sql.replaceAll("\\\\","\\\\\\\\");
	  ret = ret.replaceAll("\"","\\\\\"");
	  return ret;
  }
  
  /**
   * Construit un objet a partir de la connexion generiquze
   * @param sql Requete SQL a faire
   * @return le resultat
   */
  public static ArrayList < ArrayList < String > > construct(
	      final String sql) {
	  return construct(sql,CONN);
  }
  
  /**Fonction.
   * Construit l'objet de liaison
   * cela evite d avoir un resultset
   * et de ne plus pouvoir fermer la base
   * @param sql Requete SQL a realiser
   * @param conn Connexion vers la base
   * @return Un vecteur contenant le resultat
   */
  public static ArrayList < ArrayList < String > > construct(
      final String sql, final Connexion conn) {
    final ArrayList < String > dataname = new ArrayList < String > /**/(0);
    ArrayList < String > datas = new ArrayList < String > /**/(0);
    ArrayList < ArrayList < String > > allResult =
      new ArrayList < ArrayList < String > > /**/(0);
    ResultSet rset = conn.doSQL(sql);
    if (rset != null) {
      int i = 0;
      try {
        ResultSetMetaData rsmd = rset.getMetaData();
        for (i = 0; i < rsmd.getColumnCount(); i++) {
          dataname.add(rsmd.getColumnName(i + 1));
        }
        allResult.add(dataname);
        while (rset.next()) {
          datas = new ArrayList < String > /**/();
          datas.removeAll(datas);
          for (i = 0; i < rsmd.getColumnCount(); i++) {
            datas.add(rset.getString(rsmd.getColumnName(i + 1)));
          }
          allResult.add(datas);
        }
      } catch (SQLException e) {
			LogPrincipale.add("DBOBJECT.CONSTRUCT : "+e,2);
      }
    }
    return allResult;
  }

}
